import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
// 导入日志清理插件（已安装）
import removeConsole from 'vite-plugin-remove-console';
// 导入混淆插件（已安装，可选使用）
// import JavaScriptObfuscator from 'vite-plugin-javascript-obfuscator';

export default defineConfig(({ mode }) => {
  const isProduction = mode === 'production';

  return {
    plugins: [
      vue(),

      // 生产环境日志清理插件
      isProduction && removeConsole({
        // 移除所有 console 方法
        includes: ['log', 'warn', 'error', 'info', 'debug', 'trace', 'table', 'group', 'groupEnd', 'time', 'timeEnd'],
        // 排除特定文件（如果需要）
        // exclude: ['src/utils/logger.js']
      }),

      /* 混淆配置开始 - 可选功能，需要时取消注释
      // 代码混淆插件 - 仅在生产环境启用
      isProduction && JavaScriptObfuscator({
        // 基础混淆选项
        compact: true,
        controlFlowFlattening: false,    // 避免影响 Vue3 响应式系统
        deadCodeInjection: false,        // 避免影响 Vant 组件
        debugProtection: false,          // 避免调试问题
        debugProtectionInterval: false,
        disableConsoleOutput: true,      // 禁用控制台输出
        identifierNamesGenerator: 'hexadecimal',
        log: false,
        numbersToExpressions: false,     // 避免影响数值计算
        renameGlobals: false,            // 避免影响全局变量
        selfDefending: false,            // 避免兼容性问题
        simplify: true,
        splitStrings: false,             // 避免影响字符串处理
        stringArray: true,
        stringArrayCallsTransform: false,
        stringArrayEncoding: [],
        stringArrayIndexShift: true,
        stringArrayRotate: true,
        stringArrayShuffle: true,
        stringArrayWrappersCount: 1,
        stringArrayWrappersChainedCalls: true,
        stringArrayWrappersParametersMaxCount: 2,
        stringArrayWrappersType: 'variable',
        stringArrayThreshold: 0.75,
        unicodeEscapeSequence: false,    // 避免中文显示问题

        // Vant 组件库兼容性配置
        reservedNames: [
          // 保留 Vue3 相关
          '^vue',
          '^Vue',
          '^_.*',
          '^\\$.*',
          // 保留 Vant 相关
          '^van-.*',
          '^Van.*',
          '^vant',
          '^Vant',
          // 保留 Pinia 相关
          '^use.*Store',
          '^pinia',
          '^Pinia'
        ]
      }),
      混淆配置结束 */

      // 暂时移除所有可能导致问题的插件
      // AutoImport({
      //   resolvers: [VantResolver()],
      // }),
      // Components({
      //   resolvers: [VantResolver()],
      // }),
    ].filter(Boolean), // 过滤掉 false 值

    // 路径别名配置
    resolve: {
      alias: {
        '@': '/src'
      }
    },

    // 开发服务器配置
    server: {
      proxy: {
        '/api': {  // 所有以 /api 开头的请求都会被代理
          target: 'http://localhost:8080', // 你的 Spring Boot 后端地址
          changeOrigin: true
        }
      }
    },

    // 生产环境构建配置
    build: {
      outDir: 'dist',
      assetsDir: 'assets',
      sourcemap: false,
      minify: 'terser',
      // 确保构建稳定性
      target: 'es2015',
      rollupOptions: {
        output: {
          // 简化文件命名
          chunkFileNames: 'assets/js/[name]-[hash:8].js',
          entryFileNames: 'assets/js/[name]-[hash:8].js',
          assetFileNames: 'assets/[ext]/[name]-[hash:8].[ext]'
        }
      },
      // Terser 配置 - 增强版日志清理和优化
      terserOptions: {
        compress: {
          // 移除 console 语句
          drop_console: isProduction,
          drop_debugger: isProduction,
          // 移除未使用的代码
          dead_code: true,
          // 移除无用的函数参数
          unused: true,
          // 优化条件表达式
          conditionals: true,
          // 优化比较操作
          comparisons: true,
          // 优化布尔值
          booleans: true,
          // 优化循环
          loops: true,
          // 内联函数
          inline: true
        },
        mangle: {
          // 保留类名，避免 Vue3 组件问题
          keep_classnames: true,
          // 保留函数名，避免 Vue3 组合式 API 和 Vant 组件问题
          keep_fnames: true,
          // 保留特定标识符
          reserved: [
            // Vue3 相关
            'vue', 'Vue', 'createApp', 'ref', 'reactive', 'computed', 'watch',
            'onMounted', 'onUnmounted', 'nextTick',
            // Vant 相关
            'vant', 'Vant', 'showToast', 'showDialog', 'showNotify',
            // Pinia 相关
            'pinia', 'Pinia', 'defineStore', 'useStore'
          ]
        },
        format: {
          // 移除注释
          comments: false
        }
      }
    },

    // esbuild 配置 - 开发环境和生产环境通用
    esbuild: {
      // 生产环境移除 console 和 debugger
      drop: isProduction ? ['console', 'debugger'] : [],
      // 保持类名和函数名，确保 Vue3 和 Vant 兼容性
      keepNames: true
    },

    // 定义全局常量
    define: {
      // 生产环境标识
      __DEV__: !isProduction,
      'process.env.NODE_ENV': JSON.stringify(mode)
    }
  }
});
